3
3
.
.
5
5
F
F
u
u
n
n
c
c
t
t
i
i
o
o
n
n
s
s
I
I
n
n
f
f
o
o
return (brackets are optional)
is required in Block Syntax if Function returns value
is forbidden in Assignment Syntax (single statement) & Lambda Expression Syntax
Return Data Type (brackets are optional)
can be omitted in Block Syntax only Function returns no value (Unit Data Type)
can be omitted in Assignment Syntax
Parameter Data Types can be omitted only if Anonymous Functions are stored in Variables declared with Signature.
Anonymous Functions
can't have Default Values
can't be called with Named Parameters
F
F
u
u
n
n
c
c
t
t
i
i
o
o
n
n
D
D
e
e
c
c
l
l
a
a
r
r
a
a
t
t
i
i
o
o
n
n
s
s
Named Function Declaration
//DECLARE NAMED FUNCTION.
fun greet (name:String, age:Int = 20) : (String) { return("$name is ${age} years old.") }//Block
Syntax
fun greet (name:String, age:Int = 20) : (String) = "$name is ${age} years old." //Assignment
Syntax
fun greet (name:String, age:Int = 20) = "$name is ${age} years old." //Inferred return Data
Type
//CALL FUNCTION BY NAME.
greet(name="John", age=50) //Named Parameters (order not important)
greet("John", age=50) //Indexed before Named Parameters
greet("John", 50) //Indexed Parameters
greet("John") //Default Parameters after Indexed/Named
Params
Anonymous Function Declaration & Lambda Expression
//DECLARE VARIABLE.
var greet : (String, Int) -> (String) //Function Signature
//ANONYMOUS FUNCTION DECLARATION (store anonymous function into variable)
greet = fun (name:String, age:Int) : (String) { return("$name is ${age} years old.") } //Block Syntx
greet = fun (name:String, age:Int) : (String) = "$name is ${age} years old." //Assignment Syntax
greet = fun (name:String, age:Int) = "$name is ${age} years old." //Inferred return Data Type
greet = fun (name , age) = "$name is ${age} years old." //Inferred parameter Data Types
//LAMBDA EXPRESSION (store anonymous function into variable)
greet = { name:String, age:Int -> "$name is $age years old." } //Inferred return Data Type
greet = { name , age -> "$name is $age years old." } //Inferred parameter Data Types from greet var
//CALL FUNCTION THROUGH VARIABLE.
greet("John", 50) //No Default Values and Named Parameters
V
V
a
a
r
r
i
i
a
a
b
b
l
l
e
e
N
N
u
u
m
m
b
b
e
e
r
r
o
o
f
f
A
A
r
r
g
g
u
u
m
m
e
e
n
n
t
t
s
s
&
&
S
S
c
c
o
o
p
p
e
e
Variable Number of Arguments
//DECLARE FUNCTION WITH VARARG PARAMETER.
fun sumOfNumbers(vararg numbers: Int, base: Int) : Unit {
var sum = base
for(number in numbers) { sum += number }
println(sum)
}
//CALL FUNCTION WITH VARIABLE NUMBER OF ARGUMENTS.
sumOfNumbers(1, 2, 3, 4, baseNumber = 10) //Other Parameters must be called with their names
//CALL FUNCTION WITH ARRAY ELEMENTS //var numbers : IntArray = intArrayOf(1, 2, 3, 4)
var numbers : Array<Int> = arrayOf<Int>(1, 2, 3, 4) //Use spread operator (*) to load
sumOfNumbers(*numbers.toIntArray(), base=10) //vararg Parameter with Array Elements
Function Scope
//===========================================================================================================
// DECLARE FUNCTIONS
//===========================================================================================================
fun topLevelFunction() { println("Top level Function") }
fun outerFunction() {
fun localFunction() { println("Local/Inner Function") } //Must be declared first
localFunction()
}
class Person {
fun memberFunction() { println("Member Function") }
}
fun Person.extensionFunction() { println("Extension Function") }
//===========================================================================================================
// CALL FUNCTIONS
//===========================================================================================================
fun main() {
topLevelFunction() //Top level Function
outerFunction() //Calls Local/Inner Function
var person = Person()
person.memberFunction() //Member Function (Method)
person.extensionFunction() //Extension Function
}
F
F
u
u
n
n
c
c
t
t
i
i
o
o
n
n
a
a
s
s
I
I
n
n
p
p
u
u
t
t
P
P
a
a
r
r
a
a
m
m
e
e
t
t
e
e
r
r
o
o
r
r
R
R
e
e
t
t
u
u
r
r
n
n
V
V
a
a
l
l
u
u
e
e
Function as Input Parameter
//===========================================================================================================
// FUNCTION: executeFunction
//===========================================================================================================
fun executeFunction( receivedFunction: (name: String, age: Int) -> String ) {
var result = receivedFunction("John", 20)
println(result)
}
//===========================================================================================================
// FUNCTION: main
//===========================================================================================================
fun main() {
//DECLARE LOCAL VARIABLE
var weight = 150 //It is sent as Closure Property
//DECLARE FUNCTIONS.
fun namedFunction (name: String, age: Int) : String { return("$name is $age years old and $weight kg.")
}
var anonymFunc = fun (name: String, age: Int) : String { return("$name is $age years old and $weight kg.")
}
var lambdaFunc = { name: String, age: Int -> "$name is $age years old and $weight kg"
}
//USE FUNCTIONS AS PARAMETER (Sends Closure With Weight Property).
executeFunction(::namedFunction) //Function Name
executeFunction(anonymFunc) //Variable Name
executeFunction(lambdaFunc) //Variable Name
executeFunction( fun (name: String, age: Int) : String { return("$name is $age years old and $weight kg")
})
executeFunction( { name: String, age: Int -> "$name is $age years old and $weight kg" } ) //Lambda
}
Function as Return Value
//===========================================================================================================
//FUNCTION: getFunction
//===========================================================================================================
fun returnFunction ( weight: Int) : (name: String, age: Int) -> String {
return { name: String, age: Int -> "$name is $age years old and $weight kg" }
}
//===========================================================================================================
//FUNCTION: main
//===========================================================================================================
fun main() {
var returnedFunction = returnFunction(150) //Returns Closure with Weight Property already initialized
var result = returnedFunction("John", 20) //Call Function with missing Parameters
println(result)
}
I
I
n
n
f
f
i
i
x
x
M
M
e
e
t
t
h
h
o
o
d
d
Infix Method
must be member or extension functions
must have single parameter (without default value or vargarg)
can be called without '.' and brackets
Infix Method
//===========================================================================================================
// CLASS: Person
//===========================================================================================================
class Person(var age: Int) {
infix fun addAge(age: Int) : Int { return this.age + age } //must be member or extension functions
}
//===========================================================================================================
// FUNCTION: main
//===========================================================================================================
fun main() {
//CALL METHOD.
var person = Person(20)
var newAge = person.addAge(10) //Normal call
newAge = person addAge 10 //Infix call (must have single parameter without default value or vargarg)
//DISPLAY RESULT.
print(newAge)
}